package classes.pintaFormulario
{
	import classes.login.Modulo;
	
	import flash.events.Event;
	import flash.sampler.NewObjectSample;
	
	import mx.collections.ArrayCollection;
	import mx.collections.ArrayList;
	import mx.collections.IList;
	import mx.containers.TabNavigator;
	import mx.controls.Alert;
	import mx.controls.DateField;
	import mx.controls.Spacer;
	import mx.core.ContainerCreationPolicy;
	import mx.core.FlexGlobals;
	import mx.core.IVisualElement;
	import mx.core.UIComponent;
	import mx.events.FlexEvent;
	import mx.managers.CursorManager;
	import mx.rpc.CallResponder;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	
	import services.glb.GLBService;
	
	import skins.MyDropDownListIV;
	import skins.MyListSkinIV;
	import skins.MyTextInputIV;
	import skins.scroller.SlimScrollerSkin;
	
	import spark.components.BorderContainer;
	import spark.components.DropDownList;
	import spark.components.Label;
	import spark.components.List;
	import spark.components.NavigatorContent;
	import spark.components.Scroller;
	import spark.components.TextArea;
	import spark.components.TextInput;
	import spark.components.VGroup;
	import spark.events.IndexChangeEvent;
	import spark.layouts.VerticalLayout;
	import spark.skins.spark.ScrollerSkin;
	
	import vo.glb.GLBgetDimCatPreOpcXFichaCursor0RS;
	import vo.glb.GLBgetDimCatPreOpcXFichaCursor2RS;
	import vo.glb.GLBgetDimCatPreOpcXFichaCursor4RS;
	import vo.glb.GLBgetDimCatPreOpcXFichaCursor6RS;
	import vo.glb.GLBgetDimCatPreOpcXFichaIN;
	import vo.glb.GLBgetDimCatPreOpcXFichaOUT;
	import vo.glb.GLBgetRespuestasCursor0RS;
	import vo.glb.GLBgetRespuestasIN;
	import vo.glb.GLBgetRespuestasOUT;
	
	public class InnoLayout extends UIComponent
	{
		private var glbServiceInvoke:GLBService;
		private var glbServiceResponderGetDimCatPreOpcXFicha:CallResponder;
		private var glbServiceResponderGetRespuestas:CallResponder;
		private var ficha:FichaLayout = new FichaLayout();
		private var dimArray:ArrayCollection;
		private var catArray:ArrayCollection;
		private var preArray:ArrayCollection;
		private var opcArray:ArrayCollection;
		private var resRespArray:ArrayCollection;
		private var arrayModulos:Vector.<Modulo> = FlexGlobals.topLevelApplication.usuarioLogeado.MODULOS;
		private var modActual:Modulo;
		//private var resArrayMap:IMap = new HashMapCollection();
		private var preDependMap:IMap = new HashMapCollection();
		//private var singletonFicha:ArrayTabNavegatorSingleton = ArrayTabNavegatorSingleton.getInstance();
		
		public function InnoLayout()
		{
			//Inicializar variables 
			setParameters();
		}
		
		private function setParameters():void
		{
			glbServiceInvoke = new GLBService();
			glbServiceResponderGetDimCatPreOpcXFicha = new CallResponder();		
			glbServiceResponderGetRespuestas = new CallResponder();	
			
			glbServiceInvoke.wsdl = FlexGlobals.topLevelApplication.glbWSDL;
			
			//Handler Eventos
			glbServiceInvoke.addEventListener(FaultEvent.FAULT, handleFault_GetDimCatPreOpcXFicha);
			glbServiceResponderGetDimCatPreOpcXFicha.addEventListener(ResultEvent.RESULT, handleResut_GetDimCatPreOpcXFicha);
			glbServiceResponderGetRespuestas.addEventListener(ResultEvent.RESULT, handleResut_GetRespuestas);
		}
		
		public function generateTabNavigator(idFicha:int):void
		{
			CursorManager.setBusyCursor();
			ficha.idFicha = idFicha;
			modActual =  FlexGlobals.topLevelApplication.moduloCargado;			
			callGetDimCatPreOpcXFichaIN(idFicha);			
		}
		
		private function callGetDimCatPreOpcXFichaIN(idFicha:int):void
		{
			var msgIn:GLBgetDimCatPreOpcXFichaIN = new GLBgetDimCatPreOpcXFichaIN();
			msgIn.IdFicha = idFicha;
			glbServiceResponderGetDimCatPreOpcXFicha.token = glbServiceInvoke.gLBgetDimCatPreOpcXFicha(msgIn);
		}
		
		public function callGetRespuestas(idFicha:int,idSujeto:int):void
		{
			var msgIn:GLBgetRespuestasIN = new GLBgetRespuestasIN();
			msgIn.IdFicha = idFicha;
			msgIn.IdSujeto = idSujeto;
			glbServiceResponderGetRespuestas.token = glbServiceInvoke.gLBgetRespuestas(msgIn);
		}	
		
		protected function handleFault_GetDimCatPreOpcXFicha(event:FaultEvent):void
		{
			// TODO Auto-generated method stub
			Alert.show("error");			
		}
		
		protected function handleResut_GetDimCatPreOpcXFicha(event:ResultEvent):void
		{	
			if(event.result != null)
			{
				if((event.result as GLBgetDimCatPreOpcXFichaOUT).GLBgetDimCatPreOpcXFichaCursor0.length == 0)
				{
					FlexGlobals.topLevelApplication.closeActiveModule(true);
					Alert.show("No hay información para cargar de la ficha seleccionada.");
					CursorManager.removeAllCursors();
					return;
				}
				
				var resultWs:GLBgetDimCatPreOpcXFichaOUT = event.result as GLBgetDimCatPreOpcXFichaOUT;	
				dimArray = resultWs.GLBgetDimCatPreOpcXFichaCursor0;
				catArray = resultWs.GLBgetDimCatPreOpcXFichaCursor2;
				preArray = resultWs.GLBgetDimCatPreOpcXFichaCursor4;
				opcArray = resultWs.GLBgetDimCatPreOpcXFichaCursor6;
				
				//Se comienza a crear los componentes graficos!!!
				createTabNavigator(resultWs);
			}			
			var e:Event = new Event("Pintura_Pintada",true);
			this.dispatchEvent(e);
		}
		
		
		
		/*
		*FICHA
		*/
		private function createTabNavigator(resultWs:GLBgetDimCatPreOpcXFichaOUT):void
		{
			//Config TabNavigator
			ficha.tabNavFicha.percentHeight = 100;
			ficha.tabNavFicha.percentWidth = 100;
			
			//Iteracion de Dimensiones que pertecen a esta ficha
			for(var d:int = 0;d < dimArray.length ; d++)
			{
				var dim:GLBgetDimCatPreOpcXFichaCursor0RS = new GLBgetDimCatPreOpcXFichaCursor0RS();
				dim = dimArray[d] as GLBgetDimCatPreOpcXFichaCursor0RS;
				//Se agrega la dimensionLayout
				ficha.tabNavFicha.addChild(createNavigatorContent(dim));
			}
			FlexGlobals.topLevelApplication.hashFichas.addItem(ficha.idFicha,ficha);
		}
		
		/*
		*DIMENSION
		*/
		private function createNavigatorContent(dim:GLBgetDimCatPreOpcXFichaCursor0RS):NavigatorContent
		{
			var dimBreakFlag:Boolean = false;
			var dimNavigatorContent:NavigatorContent = new NavigatorContent();
			//Config NavigatorContent
			dimNavigatorContent.id = dim.IdDimension+"dim"+"nav";
			dimNavigatorContent.percentHeight = 100;
			dimNavigatorContent.percentWidth = 100;
			dimNavigatorContent.label = dim.Nombre;
			dimNavigatorContent.setStyle("borderColor", 0xBAB8BF);
			
			var scroller:Scroller = new Scroller();
			scroller.percentHeight = 100;
			scroller.percentWidth = 100;
			scroller.setStyle("skinClass", Class(SlimScrollerSkin));
			
			//Config VGroup contenido dentro de NavigatorContent
			var dimVgroup:VGroup = new VGroup();
			dimVgroup.percentHeight = 100;
			dimVgroup.percentWidth = 100;
			dimVgroup.id = dim.IdDimension+"dim"+"vgroup";
			dimVgroup.setStyle("borderWeight", "0");
			
			//Si coloco esta linea  "dimNavigatorContent.addElement(dimVgroup)" aca, el bordercontainer aparece sin el borde de la linea 
			
			//Iteracion de Categorias que pertenecen a una dimension en particular
			for(var c:int = 0; c < catArray.length; c++)
			{
				var cat:GLBgetDimCatPreOpcXFichaCursor2RS = new GLBgetDimCatPreOpcXFichaCursor2RS();
				cat = catArray[c] as GLBgetDimCatPreOpcXFichaCursor2RS;
				if(dim.IdDimension == cat.IdDimension)
				{
					dimBreakFlag = true;
					//Se agrega la categoriaLayout
					dimVgroup.addElement(createBorderContainer(cat));
					//NOOO se puede eliminar el item en el que me encuentro parado, 
					//debido a que el que toma el lugar puede ser cualquiera que se encuentre despues...=>catArray.removeItemAt(c);
					//Bajo esta modalidad de solución sólo recorro la mitad del arreglo 
				}else{
					//Se termina de recorrer la dimensio actual, por ende se termina el for
					if(dimBreakFlag)
						break;
				}
			}
			
			scroller.viewport = dimVgroup;
			dimNavigatorContent.addElement(scroller);
			
			return dimNavigatorContent;
		}
		
		/*
		*CATEGORIA
		*/
		private function createBorderContainer(cat:GLBgetDimCatPreOpcXFichaCursor2RS):BorderContainer
		{
			var catBreakFlag:Boolean = false;
			var catBorderContainer:BorderContainer = new BorderContainer();
			//Config BorderContainer
			catBorderContainer.id = cat.IdCategoria +"cat"+"border";
			//catBorderContainer.percentHeight = 100;
			catBorderContainer.percentWidth = 100;
			catBorderContainer.layout = new VerticalLayout();
			catBorderContainer.setStyle("borderWeight", "1");
			catBorderContainer.setStyle("borderAlpha", "0");
			//Config Label para el nombre de la categoria
			var lblNombreCat:Label = new Label();
			lblNombreCat.id = cat.IdCategoria + "cat" + "lbl";
			lblNombreCat.text = cat.Nombre;
			lblNombreCat.styleName = "titulosNegritaCategoria";
			//Se agrega el nombre de la categoria
			catBorderContainer.addElement(lblNombreCat);
			
			var separator:Spacer = new Spacer;
			separator.height = 10;
			catBorderContainer.addElement(separator);
			
			for(var p:int = 0; p < preArray.length; p++)
			{
				var pre:GLBgetDimCatPreOpcXFichaCursor4RS = new GLBgetDimCatPreOpcXFichaCursor4RS();
				pre = preArray[p] as GLBgetDimCatPreOpcXFichaCursor4RS;
				
				if(cat.IdCategoria == pre.IdCategoria)
				{
					catBreakFlag = true;
					catBorderContainer.addElement(createVGroup(pre));
				}else{
					//Se termina de recorrer la dimensio actual, por ende se termina el for
					if(catBreakFlag)
						break;
				}
			}
			
			return catBorderContainer;
		}
		
		/*
		*PREGUNTA
		*/
		private function createVGroup(pre:GLBgetDimCatPreOpcXFichaCursor4RS):VGroup
		{	
			var vgPre:VGroup = new VGroup();
			vgPre.paddingLeft = 10;
			vgPre.id = pre.IdPregunta + "pre" +"vgroup";
			//vgPre.percentHeight = 100;
			vgPre.percentWidth = 100;
			
			var lblTituloPre:Label = new Label();
			lblTituloPre.id = pre.IdPregunta + "pre" + "lbl";
			lblTituloPre.text = pre.Numero + ".-"+pre.Nombre;
			
			//Valida si la pregunta debe ser desactivada, debido a que tiene un dependencia con otra
			if(pre.IdOpcion != 0)
			{
				vgPre.enabled = false;
				//Tabla Hash que almacena el idPregunta y Vgroup que tiene una depencia con alguna opción
				preDependMap.addItem(pre.IdPregunta,vgPre);
			}			
			
			vgPre.addElement(lblTituloPre);
			//Se llama a la función createIVisualElement que es la encargada de crear el objeto grafico asociado al tipo de respuesta.
			vgPre.addElement(createIVisualElement(pre));
			var separator:Spacer = new Spacer;
			separator.height = 15;
			vgPre.addElement(separator);
			return vgPre;
		}
		
		/*
		*Metodo encargado de agregar las respuestas
		*/
		private function addRespuesta(vsRes:IVisualElement,pre:GLBgetDimCatPreOpcXFichaCursor4RS):void
		{
			var res:Respuesta = new Respuesta();
			res.idDim = ficha.idFicha;
			res.ts = 0;//valor por defecto
			res.veRes = vsRes;				
			FlexGlobals.topLevelApplication.hashRespuestas.addItem(pre.IdPregunta, res);
		}
		
		/*
		*CORRESPONDE A LA OPCION 1(Texto Alfanumerico) Y 2(Texto Numerico) DE LA TABLA TIPO DE OBJETO
		*/
		private function createTextArea(pre:GLBgetDimCatPreOpcXFichaCursor4RS):TextArea
		{
			//Config TextArea
			var txtRes:TextArea = new TextArea();
			txtRes.id = pre.IdPregunta + "res" + "textarea";
			txtRes.percentWidth = 50;
			//txtRes.percentHeight = 100;
			txtRes.minHeight = 60;
			txtRes.maxHeight = 60;
			txtRes.setStyle("skinClass", MyTextInputIV);
			
			if(pre.IdTipo == 1)
			{
				
			}else
			{
				txtRes.restrict="0-9";
			}
			
			//Se agrega la respuesta al arrayRespuestas que será utilizado para almacenar las respuestas.
			
			if(modActual.ID_ACCESO == 2)
			{
				txtRes.enabled = false;
				addRespuesta(txtRes,pre);
			}
			else
				addRespuesta(txtRes,pre);
			//este objeto antes de enviarlo se debería agregar a una clase que almacenaría los objetos graficos para la respuesta... 
			//de tal manera, que se pueda establecer una relacion matricial entre el id de la pregunta y su correspondiente respuesta.								
			return txtRes;		
		}
		
		/*
		*CORRESPONDE A LA OPCION 3(Fecha) DE LA TABLA TIPO DE OBJETO
		*/
		private function createDateField(pre:GLBgetDimCatPreOpcXFichaCursor4RS):DateField
		{
			var dfRes:DateField = new DateField();
			dfRes.id = pre.IdPregunta + "res" + "datefield";
			dfRes.setStyle("textInputStyleName","roundedTI");
			dfRes.dayNames = [ "D", "L", "M", "Mi", "J", "V", "S" ];
			dfRes.monthNames = [ "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", 
				"Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" ];
			dfRes.firstDayOfWeek = 1; //Lunes
			dfRes.formatString = "DD/MM/YYYY";
			dfRes.yearNavigationEnabled = true;
			
			if(modActual.ID_ACCESO == 2)
			{
				dfRes.enabled = false;
				addRespuesta(dfRes,pre);
			}
			else
				addRespuesta(dfRes,pre);
			return dfRes;
		}
		
		/*
		*CORRESPONDE A LA OPCION 4(Listado de Opciones) DE LA TABLA TIPO DE OBJETO
		*/
		private function createDropDownList(pre:GLBgetDimCatPreOpcXFichaCursor4RS):DropDownList
		{
			var ddlOpc:DropDownList = new DropDownList();
			ddlOpc.id = pre.IdPregunta + "res" + "dropdownlist";
			ddlOpc.dataProvider = createDataProvider(pre); 
			ddlOpc.labelField = "Nombre";
			ddlOpc.prompt = "Seleccione...";
			ddlOpc.width = 350;
			ddlOpc.setStyle("skinClass", Class(MyDropDownListIV));
			
			ddlOpc.addEventListener(IndexChangeEvent.CHANGING,handlerChangeDropDownList)
			
			if(modActual.ID_ACCESO == 2)
			{
				ddlOpc.enabled = false;
				addRespuesta(ddlOpc,pre);
			}
			else
				addRespuesta(ddlOpc,pre);
			
			return ddlOpc;		
		}
		
		/*
		*CORRESPONDE A LA OPCION 5(Selección Multiple) DE LA TABLA TIPO DE OBJETO
		*/
		private function createList(pre:GLBgetDimCatPreOpcXFichaCursor4RS):List
		{
			var listRes:List = new List();
			listRes.id = pre.IdPregunta + "res" + "list";
			listRes.height = 200;
			listRes.setStyle("skinClass", Class(MyListSkinIV));
			
			listRes.width = 350;			
			
			listRes.dataProvider = createDataProvider(pre); 
			listRes.allowMultipleSelection = true;
			listRes.labelField = "Nombre";
			
			if(modActual.ID_ACCESO == 2)
			{
				listRes.enabled = false;
				addRespuesta(listRes,pre);
			}
			else
				addRespuesta(listRes,pre);
			
			return listRes;
		}
		
		private function handlerChangeDropDownList(e:IndexChangeEvent):void
		{
			if(e.oldIndex == -1 && e.newIndex == -1)
			{
				var opcSelected:GLBgetDimCatPreOpcXFichaCursor6RS = e.currentTarget.selectedItem  as GLBgetDimCatPreOpcXFichaCursor6RS;
				if(opcSelected!=null)
				{
					if(opcSelected.IdPreguntaRel != null)
					{
						var preDepArraySelected:Array = opcSelected.IdPreguntaRel.toString().split("|");
						for(var y:int = 0; y < preDepArraySelected.length; y++)
						{
							var vgPreDependSelected:VGroup = preDependMap.getItemValue(preDepArraySelected[y]) as VGroup;
							if(vgPreDependSelected!=null)
							{
								vgPreDependSelected.enabled = true;	
							}
						}
					}
				}
			}else
			{
				if(e.oldIndex != -1)
				{
					var opcOld:GLBgetDimCatPreOpcXFichaCursor6RS = e.currentTarget.dataProvider.getItemAt(e.oldIndex)  as GLBgetDimCatPreOpcXFichaCursor6RS;
					
					if(opcOld.IdPreguntaRel != null)
					{
						var preDepArrayOld:Array = opcOld.IdPreguntaRel.toString().split("|");
						for(var i:int = 0; i < preDepArrayOld.length; i++)
						{
							var vgPreDependOld:VGroup = preDependMap.getItemValue(preDepArrayOld[i]) as VGroup;
							if(vgPreDependOld!=null)
							{
								var typeClass:String = vgPreDependOld.getElementAt(1)["className"];
								if(typeClass == "List")
								{
									var list:List = vgPreDependOld.getElementAt(1) as List;
									list.selectedIndices = null;
								}
								
								if(typeClass == "DropDownList")
								{
									var dropDownList:DropDownList = vgPreDependOld.getElementAt(1) as DropDownList;
									dropDownList.selectedIndex = -1;
								}
								
								if(typeClass == "TextArea")
								{
									var txtArea:TextArea = vgPreDependOld.getElementAt(1) as TextArea;
									txtArea.text = "";
								}
								
								if(typeClass == "DateField")
								{
									var dateField:DateField = vgPreDependOld.getElementAt(1) as DateField;
									dateField.text = "";
								}
								
								vgPreDependOld.enabled = false;	
							}
						}
					}
				}
				
				var opcNew:GLBgetDimCatPreOpcXFichaCursor6RS = e.currentTarget.dataProvider.getItemAt(e.newIndex)  as GLBgetDimCatPreOpcXFichaCursor6RS;
				if(opcNew.IdPreguntaRel != null)
				{
					var preDepArrayNew:Array = opcNew.IdPreguntaRel.toString().split("|");
					for(var x:int = 0; x < preDepArrayNew.length; x++)
					{
						var vgPreDependNew:VGroup = preDependMap.getItemValue(preDepArrayNew[x]) as VGroup;
						if(vgPreDependNew!=null)
						{
							vgPreDependNew.enabled = true;	
						}
					}
				}
			
			}			
								
		}
		
		/*
		*OPCIONES-RESPUESTAS
		*/
		private function createIVisualElement(pre:GLBgetDimCatPreOpcXFichaCursor4RS):IVisualElement
		{
			switch(pre.IdTipo) 
			{ 
				case 1: 
					return createTextArea(pre);//Alfanumerico
				case 2: 
					return createTextArea(pre);//Numerico
				case 3: 
					return createDateField(pre);
				case 4: 
					return createDropDownList(pre); 
				case 5: 
					return createList(pre); 
				
				default: 
					Alert.show("Tipo de objeto gráfico no valido.","Error"); 
					var lblError:Label = new Label();
					lblError.text = "Error al crear el tipo de respuesta. Objeto gráfico no valido.";
					return lblError;					
			}	
					
		}
		
		private function createDataProvider(pre:GLBgetDimCatPreOpcXFichaCursor4RS):IList
		{
			var arrayDataProviderOpc:ArrayCollection = new  ArrayCollection();
			var opcBreakFlag:Boolean = false;
						
			for(var o:int = 0; o < opcArray.length; o++)
			{
				var opc:GLBgetDimCatPreOpcXFichaCursor6RS = new GLBgetDimCatPreOpcXFichaCursor6RS();				
				opc = opcArray[o] as GLBgetDimCatPreOpcXFichaCursor6RS;
				
				if(opc.IdPregunta == pre.IdPregunta)
				{
					opcBreakFlag = true;
					arrayDataProviderOpc.addItem(opc);
				}else{
					//Se termina de recorrer la dimensio actual, por ende se termina el for
					if(opcBreakFlag)
						break;
				}
			}	
			return arrayDataProviderOpc;			
		}
		
		protected function handleResut_GetRespuestas(event:ResultEvent):void
		{	
			if(event.result != null)
			{
				var resultWS:GLBgetRespuestasOUT = event.result as GLBgetRespuestasOUT;
				resRespArray = resultWS.GLBgetRespuestasCursor0;
				
				cargarRespuestas();
			}
			var e:Event = new Event("Respuestas_Cargadas",true);
			this.dispatchEvent(e);
			CursorManager.removeBusyCursor();
		}
		
		public function cargarRespuestas():void
		{
			for(var i:int =0; i < resRespArray.length ; i++)
			{
				var resHashItem:Object = new Object();
				var resResp:GLBgetRespuestasCursor0RS = resRespArray[i];
				resHashItem = FlexGlobals.topLevelApplication.hashRespuestas.getItemValue(resResp.IdPregunta);
				if(resHashItem == null)
				{
					Alert.show("Inconsistencia entre las preguntas","Error");
				}else{
					var iVisual:IVisualElement = resHashItem.veRes as IVisualElement;
					if(iVisual!=null)
					{
						var typeClass:String = iVisual["className"];
						if(typeClass == "List")
						{
							var list:List = iVisual as List;
							if(resResp.IdOpcion.toString() != "0") 
								PosicionadorListas.execSparkList(resResp.IdOpcion.toString(),list,"IdOpcion");
							else
								list.selectedItems = new Vector.<Object>;
						}
						
						if(typeClass == "DropDownList")
						{
							var dropDownList:DropDownList = iVisual as DropDownList;
							PosicionadorListas.execDropDownList(resResp.IdOpcion.toString(),dropDownList,"IdOpcion");
							dropDownList.dispatchEvent(new IndexChangeEvent(IndexChangeEvent.CHANGING,true));
						}
						
						if(typeClass == "TextArea")
						{
							var txtArea:TextArea = iVisual as TextArea;
							txtArea.text = resResp.RespTxt;							
						}
						
						if(typeClass == "DateField")
						{
							//Validar que esto este correcto 
							var dateField:DateField = iVisual as DateField;
							if(resResp.RespTxt == null)
								dateField.selectedDate = null;
							else
								dateField.text = resResp.RespTxt;
						}					
						
					}else
					{
						Alert.show("Inconsistencia en el objeto IVisual de la Hash-Respuesta","Error");					
					}
				}
			}
		}	
		
		public function limpiarRespuestas():void
		{
			
		}
	
	}
	
}